<?php

// +----------------------------------------------------------------------
// | 版权所有 2014~2024 魏东 [ 54928382@qq.com]
// +----------------------------------------------------------------------

declare(strict_types=1);

namespace app\curd\controller;

use think\admin\Controller;
use app\curd\model\CurdMvc;
use think\admin\helper\QueryHelper;
use think\facade\Console;
use think\helper\Str;

class Mvc extends Controller
{
    /**
     * 列表
     * @auth true
     * @menu true
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public function index()
    {
        // 支持 Layui 表格数据加载
        CurdMvc::mQuery()->layTable(function () {
            // 前置操作，处理 HTML 模板
            //页面标题名称
            $this->title = 'CURD文件生成';
            $this->showErrorMessage = lang("此功能需要专业人员操作，请先创建数据库的表结构！");
        }, static function (QueryHelper $query) {
            // 后置操作，处理表格数据

        });
    }

    /**
     * 添加
     * @auth true
     */
    public function add()
    {
        CurdMvc::mForm('form');
    }

    /**
     * 修改
     * @auth true
     */
    public function edit(): void
    {
        CurdMvc::mForm('form');
    }

    /**
     * 表单数据处理
     * @param array $data
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    protected function _form_filter(array &$data)
    {
        if ($this->request->isPost()) {
            // 应用小写
            $data['appname'] = Str::lower($data['appname']);
            // 控制器名 大驼峰法
            $data['controllername'] = Str::studly($data['controllername']);
            // 模型名 大驼峰法
            $data['modelname'] = Str::studly($data['modelname']);

            // 控制器和模型 不能一样
            if ($data['controllername'] == $data['modelname']) {
                $this->error('控制器和模型名称不能一样！');
            }
        }
    }


    /**
     * 删除
     * @auth true
     */
    public function remove(): void
    {
        CurdMvc::mDelete();
    }

    /**
     * 一键生成curd
     * @auth true
     * @return void
     */
    public function curd(): void
    {
        if ($this->request->isGet()) {
            //生成模型
            Console::call("xcurd:m", [$this->request->param('appname') . '@' . $this->request->param('modelname')]);
            //生成控制器
            Console::call("xcurd:c", [$this->request->param('appname') . '@' . $this->request->param('controllername'), $this->request->param('modelname')]);
            //生成视图form和index
            Console::call("xcurd:v", [$this->request->param('appname') . '@' . $this->request->param('controllername')]);

            $this->success("已生成模型、控制器、视图form和index文件，请添加菜单关联控制器！");
        }

    }

    /**
     * 生成模型
     * @auth true
     * @return void
     */
    public function m(): void
    {
        if ($this->request->isGet()) {
            //生成模型
            Console::call("xcurd:m", [$this->request->param('appname') . '@' . $this->request->param('modelname')]);

            $this->success("已生成模型文件！");
        }

    }

    /**
     * 生成控制器
     * @auth true
     * @return void
     */
    public function c(): void
    {
        if ($this->request->isGet()) {
            //生成控制器
            Console::call("xcurd:c", [$this->request->param('appname') . '@' . $this->request->param('controllername'), $this->request->param('modelname')]);

            $this->success("已生成控制器文件！");
        }

    }

    /**
     * 生成视图
     * @auth true
     * @return void
     */
    public function v(): void
    {
        if ($this->request->isGet()) {
            //生成视图form和index
            Console::call("xcurd:v", [$this->request->param('appname') . '@' . $this->request->param('controllername')]);

            $this->success("已生成视图文件form和index！");
        }

    }


}
